#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
//
//#define ROW 9
//#define COL 9
//
//#define ROWS ROW+2
//#define COLS COL+2
//
//#define MINE_COUNT 10
//
//void InitBoard(char board[][COLS], int row, int col, char c);
///*
//* row: 雷区的行
//* col ：雷区的列
//*/
//void SetMine(char board[][COLS], int row, int col);
//
//void ShowBoard(char board[][COLS], int row, int col);
//
//void JudgeMine(char user_display[][COLS], char mine[][COLS], int row, int col);
//
//
//void InitBoard(char board[][COLS], int row, int col, char c)
//{
//	for (int i = 0; i < row; i++)
//	{
//		for (int j = 0; j < col; j++)
//		{
//			board[i][j] = c;
//		}
//	}
//}
//
//void ShowBoard(char board[][COLS], int row, int col)
//{
//	//printf("--------------begin-----------\n");
//	for (int i = 0; i <= col; i++)
//	{
//		printf("%d ", i);
//	}
//	printf("\n");
//
//	for (int i = 1; i <= row; i++)
//	{
//		printf("%d ", i);
//		for (int j = 1; j <= col; j++)
//		{
//			printf("%c ", board[i][j]);
//		}
//		printf("\n");
//	}
//	printf("---------------end------------\n");
//}
//
//void SetMine(char board[][COLS], int row, int col)
//{
//	int mine_count = MINE_COUNT;
//
//	//[1,9]
//	//rand() ==> [0, 32767]
//	//rand() % 9  ==> [0, 8]
//	while (mine_count > 0)
//	{
//		int x = rand() % row + 1;
//		int y = rand() % col + 1;
//		if(board[x][y] == '0')
//		{
//			board[x][y] = '1';
//			mine_count--;
//		}
//	}
//}
//
//
//void Game()
//{
//	/*
//	* 1.初始化两个棋盘， 给用户展示的棋盘， 一个是代码计算是否有雷的棋盘
//	*     1.2 给用户展示的棋盘， 初始化为?
//	*     1.3 给代码棋盘初始化为全字符0
//	* 2.给代码棋盘初始化雷区
//	*     2.1 随机进行初始化雷区
//	* 3.给用户展示的棋盘就展示出来
//	* 4.采集用户输入， 进行判断
//	*     踩雷： 游戏结束
//	*     没有踩雷： 
//	*         计算当前位置， 附近的雷的数值， 展示给用户
//	*/
//	char user_display[ROWS][COLS];
//	char mine_board[ROWS][COLS];
//
//	InitBoard(user_display, ROWS, COLS, '?');
//	InitBoard(mine_board, ROWS, COLS, '0');
//
//	ShowBoard(user_display, ROW, COL);
//	//ShowBoard(mine_board, ROW, COL);
//
//	SetMine(mine_board, ROW, COL);
//	//ShowBoard(mine_board, ROW, COL);
//
//	JudgeMine(user_display, mine_board, ROW, COL);
//}
//
//int GetMineCount(char b[][COLS], int x, int y)
//{
//	return b[x - 1][y - 1] + b[x - 1][y] + b[x - 1][y + 1] +
//		b[x][y - 1] + b[x][y + 1] + b[x + 1][y - 1] +
//		b[x + 1][y] + b[x + 1][y + 1] - 8 * '0';
//}
//
//
//void JudgeMine(char user_display[][COLS], char mine[][COLS], int row, int col)
//{
//	int step_count = 0;
//	while (step_count < row * col - MINE_COUNT)
//	{
//		printf("please enter x,y: ");
//		fflush(stdout);
//		int x, y;
//		scanf("%d,%d", &x, &y);
//
//		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
//		{
//			if (mine[x][y] == '1')
//			{
//				//是雷
//				printf("很遗憾， 踩到雷了， 游戏结束\n");
//				ShowBoard(mine, ROW, COL);
//				break;
//			}
//			else
//			{
//				//不是雷
//				int mine_count = GetMineCount(mine, x, y);
//				printf("mine_count : %d\n", mine_count);
//				user_display[x][y] = mine_count + '0';
//				ShowBoard(user_display, ROW, COL);
//
//				step_count++;
//			}
//		}
//		else
//		{
//			printf("输入的坐标错误， 请重新输入\n");
//		}
//	}
//
//	if (step_count == ROW * COL - MINE_COUNT)
//	{
//		printf("恭喜你， 你赢了...\n");
//	}
//
//}
//
//void Menu()
//{
//	printf("*************begin game****************\n");
//	printf("*** 1. paly ************** 2. 退出******\n");
//	printf("*****************end*******************\n");
//}
//
//int main()
//{
//	srand((unsigned int)time(NULL));
//	setvbuf(stdout, NULL, _IONBF, 0);
//	int input = 0;
//	do
//	{
//		Menu();
//		printf("please select: ");
//		fflush(stdout);
//
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			Game();
//			break;
//		case 2:
//			printf("即将退出， 拜拜， 欢迎下次再来\n");
//			input = 0;
//			break;
//		default:
//			printf("输入的内容有误， 请重新开始...\n");
//			input = 9999;
//			break;
//		}
//
//	} while (input);
//
//	return 0;
////}
//
//
//
//void swap(int* a, int* b)
//{
//	int c = *a;
//	*a = *b;
//	*b = c;
//}


//乘法口诀表
//题目内容：
//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定
//
//如：输入9，输出9 * 9口诀表，输出12，输出12 * 12的乘法口诀表。
//
//int func(int row, int col)
//{
//	for (int i = 1; i <= row; i++)
//	{
//		for (int j = 1; j <= i; j++)
//		{
//			printf("%d*%d=%d ", i, j, i * j);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	func(12, 9);
//	return 0;
//}

//
//题目名称：
//打印一个数的每一位
//题目内容：
//递归方式实现打印一个整数的每一位

//int func(int num)
//{
//	if (num > 10)
//	{
//		func(num / 10);
//	}
//	printf("%d ", num % 10);
//}
//
//int main()
//{
//	func(1234);
//	printf("\n");
//	return 0;
//}


//题目名称：
//求阶乘
//题目内容：
//递归和非递归分别实现求n的阶乘（不考虑溢出的问题）

//int func(int n)
//{
//	int total = 1;
//	for (int i = n; i > 0; i--)
//	{
//		total *= i;
//	}
//	return total;
//}
//
//int func1(int n)
//{
//	if (n == 1)
//	{
//		return 1;
//	}
//	return n * func1(n - 1);
//}
//
//int main()
//{
//	printf("%d\n", func(5));
//	printf("%d\n", func1(5));
//	return 0;
//}


//题目名称：
//字符串逆序（递归实现）
//题目内容：
//编写一个函数 reverse_string(char* string)（递归实现）
//实现：将参数字符串中的字符反向排列，不是逆序打印。
//要求：不能使用C函数库中的字符串操作函数。
//比如 :
//char arr[] = "abcdef";
//逆序之后数组的内容变成：fedcba


void func(char* str)
{
	char head_str = *str;
	int str_len = strlen(str);
	*str = *(str + str_len - 1);
	*(str + str_len - 1) = '\0';

	if (strlen(str + 1) >= 2)
	{
		func(str + 1);
	}

	*(str + str_len - 1) = head_str;
}

int main()
{
	char arr[] = "abcdef";
	func(arr);
	printf("%s\n", arr);
	return 0;
}
